home *** CD-ROM | disk | FTP | other *** search
- /*
- ARTemis (Graphic Editor for FM-TOWNS)
- (c) MATSUUCHI Ryosuke 1992-1993
-
- mag.c
- */
-
-
- #define USEMAG 0
-
-
- #include <stdio.h>
- #include <process.h>
- #include <egb.h>
- #include <conio.h>
- #include <ryosuke.h>
- #include <usrlib.h>
- #include <memory.h>
- #include <snd.h>
- #include <msdos.cf>
-
-
- #if USEMAG
-
-
- static void _setplt(int plt, int g, int r, int b)
- {
- char pal_[4+8*16];
- DWORD(pal_ + 0) = 1;
- DWORD(pal_ + 4) = plt;
- BYTE (pal_ + 8) = b<<4;
- BYTE (pal_ + 9) = r<<4;
- BYTE (pal_ +10) = g<<4;
- BYTE (pal_ +11) = 0;
- EGB_palette(EGB_work,0,pal_);
- }
-
-
- #endif
-
-
- int MAG_easyLoad(char *fname)
- {
- #if USEMAG
- FILE *fp_a, *fp_b, *fp_p;
- int i,j,k;
- if ((fp_a = fopen(fname, "rb")) == NULL) // フラグA読出用
- return -1;
- if ((fp_b = fopen(fname, "rb")) == NULL) // フラグB読出用
- return -1;
- if ((fp_p = fopen(fname, "rb")) == NULL) // ピクセルデータ読出用
- return -1;
-
- // チェック/コメント領域をよみとばす
- for (i=0; i<32; i++)
- fgetc(fp_a);
- int c;
- do {
- c = fgetc(fp_a);
- } while (c != 0x1a);
-
- // ヘッダ領域のファイル内オフセットを記録する
- int ofs_head;
- ofs_head = ftell(fp_a);
-
- // ヘッダを読み込んで調べる
- char head[32];
- fread(head, 1,32, fp_a);
- int ofs_a, ofs_b, ofs_pix, siz_b, siz_pix;
- ofs_a = DWORD(head+12);
- ofs_b = DWORD(head+16);
- siz_b = DWORD(head+20);
- ofs_pix = DWORD(head+24);
- siz_pix = DWORD(head+28);
-
- // パレットを読み込んで設定する
- for (i=0; i<16; i++) {
- int g,r,b;
- g = fgetc(fp_a) >> 4;
- r = fgetc(fp_a) >> 4;
- b = fgetc(fp_a) >> 4;
- _setplt(i, g,r,b);
- }
-
- // フラグA/B, ピクセルデータ用のファイル読出位置を設定する
- fseek(fp_a, ofs_head + ofs_a, SEEK_SET);
- fseek(fp_b, ofs_head + ofs_b, SEEK_SET);
- fseek(fp_p, ofs_head + ofs_pix, SEEK_SET);
-
- // 1ラインずつ展開していく
- char fbbuf1[80], fbbuf2[80];
- char linebuf[17][640];
- for (i=0; i<400; i++) {
- char *lbp;
- lbp = linebuf[i % 17];
-
- // 1ライン分のフラグB(80 bytes)を展開する
- for (j=0; j<((640/4)/2)/8; j++) {
- int a; static char mask[] = {128,64,32,16,8,4,2,1};
- a = fgetc(fp_a);
- for (k=0; k<8; k++) {
- if ((a & mask[k]) != 0)
- fbbuf1[j*8+k] = fgetc(fp_b);
- else
- fbbuf1[j*8+k] = 0;
- }
- }
- if (i > 0) {
- for (j=0; j<80; j++)
- fbbuf1[j] ^= fbbuf2[j];
- }
- memcpy(fbbuf2, fbbuf1, 80);
- // 1ラインぶんのピクセルを展開する
- static int ofsx[] = {0,-1,-2,-4,0,-1,0,-1,-2,0,-1,-2,0,-1,-2,0};
- static int ofsy[] = {0,0,0,0,-1,-1,-2,-2,-2,-4,-4,-4,-8,-8,-8,-16};
- for (j=0; j<160; j++) {
- int b,rx,ry,x,y;
- b = ((j&1)==0 ? (fbbuf1[j/2]>>4) : (fbbuf1[j/2]&15));
- x = j*4;
- y = i;
- if (b == 0) {
- int c;
- c = fgetc(fp_p);
- lbp[j*2] = (c>>4) + (c&15)*16;
- c = fgetc(fp_p);
- lbp[j*2+1] = (c>>4) + (c&15)*16;
- } else {
- rx = j*4 + ofsx[b]*4;
- ry = i + ofsy[b];
- *(short int *)&lbp[j*2] = *(short int *)&linebuf[ry%17][rx/2];
- }
- }
-
- {
- para_putBlock para;
- para.buf = lbp;
- para.bufsel = getds();
- para.x1 = 0;
- para.x2 = 639;
- para.y1 = para.y2 = i;
- EGB_putBlock(EGB_work, 0, (char*)¶);
- }
- }
- fclose(fp_p);
- fclose(fp_b);
- fclose(fp_a);
- #else
- return 0;
- #endif
- }
-
-
- #if USEMAG
-
- #define fAlen 256
-
- static FILE *fA_fp;
- static int fA_ofs;
- static char fAbuf[fAlen];
- static int fAbyteptr, fAbitptr;
-
- static void fAinit(FILE *fp, int ofs)
- {
- fA_fp = fp;
- fA_ofs = ofs;
- fAbyteptr = fAbitptr = 0;
- fAbuf[0] = 0;
- }
-
- static void fAout(int bit)
- {
- static char _bit[] = {128,64,32,16,8,4,2,1};
- if (bit)
- fAbuf[fAbyteptr] |= _bit[fAbitptr];
- fAbitptr++;
- if (fAbitptr >= 8) {
- fAbitptr = 0;
- fAbyteptr++;
- if (fAbyteptr >= fAlen) {
- int curofs;
- curofs = ftell(fA_fp);
- fseek(fA_fp, fA_ofs, SEEK_SET);
- fwrite(fAbuf, 1, fAlen, fA_fp);
- fseek(fA_fp, curofs, SEEK_SET);
- fA_ofs += fAlen;
- fAbyteptr = 0;
- }
- fAbuf[fAbyteptr] = 0;
- }
- }
-
- static void fAbyteflush()
- {
- if (fAbitptr != 0) {
- fAbyteptr++;
- fAbitptr = 0;
- if (fAbyteptr >= fAlen) {
- int curofs;
- curofs = ftell(fA_fp);
- fseek(fA_fp, fA_ofs, SEEK_SET);
- fwrite(fAbuf, 1, fAlen, fA_fp);
- fseek(fA_fp, curofs, SEEK_SET);
- fA_ofs += fAlen;
- fAbyteptr = 0;
- }
- fAbuf[fAbyteptr] = 0;
- }
- }
-
- static void fAflush()
- {
- int len;
- len = fAbyteptr + (fAbitptr+7)/8;
- if (len > 0) {
- int curofs;
- curofs = ftell(fA_fp);
- fseek(fA_fp, fA_ofs, SEEK_SET);
- fwrite(fAbuf, 1, len, fA_fp);
- fseek(fA_fp, curofs, SEEK_SET);
- fA_ofs += len;
- }
- fAbyteptr = fAbitptr = 0;
- fAbuf[fAbyteptr] = 0;
- }
-
- #endif
-
-
- #if 0
-
- int MAG_save(char *fname, int x1, int y1, int xlen, int ylen, char *memo)
- // memo : MAGファイルに書き込むメモ.
- {
- FILE *fp;
- if ((fp = fopen(fname, "wb")) == NULL) {
- return -1;
- }
- // チェックデータ/コメントを書き込む
- {
- char chkdata[32];
- memcpy(chkdata, "MAKI02 ", 8);
- memcpy(chkdata+8, "TOWNS", 4);
- memcpy(chkdata+12, ">謎< ", 18);
- memset(chkdata+30,0,2);
- fwrite(chkdata, 1,32, fp);
- {
- _setmode(fp, _TEXT);
- char *p;
- for (p=memo; *p!=0; p++)
- fputc(*p, fp);
- _setmode(fp, _BINARY);
- }
- fputc(0x1a, fp);
- }
- // ヘッダ先頭のファイル内オフセットを記録する
- int ofs_head;
- ofs_head = ftell(fp);
- // ダミーヘッダを作成する
- {
- char dmy[32];
- fwrite(dmy, 1,32, fp);
- }
- // ダミーパレットを作成する
- {
- char dmy[48];
- fwrite(dmy, 1, 48, fp);
- }
- // セーブ範囲のX座標を8単位に補正し、フラグAのサイズを計算する
- int siz_a,ofs_a,ofs_b;
- {
- int x2;
- x2 = x1 + xlen -1;
- x1 = x1 - x1 % 8;
- x2 = x2 - x2 % 8 + 7;
- xlen = x2-x1+1;
- siz_a = ((xlen/4+7)/8)*ylen; // アブナーイ!
- // フラグAが、1ラインについてバイト境界におさまらなかったら、
- // どうすればいいんだろう...
- if (siz_a & 1)
- siz_a++;
- }
- ofs_a = ftell(fp);
- ofs_b = ofs_a + siz_a;
- // ダミーのフラグAを出力
- {
- int i;
- for (i=0; i<siz_a; i++)
- fputc(0, fp);
- }
- // フラグA, Bを出力していく
- {
- static int ofsx[] = {0,-1,-2,-4,0,-1,0,-1,-2,0,-1,-2,0,-1,-2,0};
- static int ofsy[] = {0,0,0,0,-1,-1,-2,-2,-2,-4,-4,-4,-8,-8,-8,-16};
- int y,x;
- char linebuf[17][xlen];
- for (y=0; y < ylen; y++) {
- char *lbp;
- lbp = linebuf[y % 17];
- grgetblk(lbp, x1,y1+y, xlen,1);
- for (x=0; x<xlen; x+=8) {
- int pixel;
- // 8ドットのうち、はじめの4ドット(1ピクセル)を処理
- pixel = *(short int *)(lbp + x/2);
- int b;
- bool found;
- found = NO;
- for (b=1; b<=15; b++) {
- int sx,sy;
- sx = x+ofsx[b]*4;
- sy = y+ofsy[b];
- if (sx<0)
- continue;
- if (sy<0)
- break;
- if (pixel == *(short int *)(linebuf[sy % 17] + sx/2))
- found = YES;
-
-
-
-
-
-
- }
-
- // 8ドットのうち、2つめの4ドット(1ピクセル)を処理
-
- // フラグBを出力
- }
- }
- }
-
-
-
-
-
-
-
- }
-
- #endif
-
- // end of mag.c
-